/**
 * @file data_dispatcher.h
 * @brief 消息分发器接口
 * @details 从IoT平台接收数据，根据规则动态分发到不同协议（104、3761、3762等）
 * 
 * @author zyb
 * @date 2025-11-04
 * @version 1.0
 */

#ifndef DATA_DISPATCHER_H
#define DATA_DISPATCHER_H

#include <stdint.h>
#include <stdbool.h>

#ifdef __cplusplus
extern "C" {
#endif

/* ==================== 协议类型定义 ==================== */

/**
 * @brief 协议类型
 */
typedef enum {
    DISPATCH_PROTOCOL_104 = 0,     /* IEC 60870-5-104协议 */
    DISPATCH_PROTOCOL_3761,        /* DL/T 376.1协议 */
    DISPATCH_PROTOCOL_3762,        /* DL/T 376.2协议 */
    DISPATCH_PROTOCOL_MAX
} dispatch_protocol_type_t;

/* ==================== 数据结构定义 ==================== */

/**
 * @brief 路由规则类型
 */
typedef enum {
    ROUTE_RULE_BY_PROPERTY,        /* 根据属性名称匹配 */
    ROUTE_RULE_BY_DEVICE_ID,       /* 根据设备ID匹配 */
    ROUTE_RULE_BY_DATA_TYPE,       /* 根据数据类型匹配 */
    ROUTE_RULE_BY_KEYWORD          /* 根据关键字匹配 */
} route_rule_type_t;

/**
 * @brief 路由规则
 */
typedef struct {
    route_rule_type_t type;        /* 规则类型 */
    char pattern[128];             /* 匹配模式 */
    dispatch_protocol_type_t protocol;  /* 目标协议 */
    int priority;                  /* 优先级（数字越小优先级越高） */
} route_rule_t;

/**
 * @brief 协议适配器接口
 */
typedef struct {
    dispatch_protocol_type_t type;     /* 协议类型 */
    const char* name;                  /* 协议名称 */
    
    /**
     * @brief 发送数据到协议
     * @param handle 适配器句柄
     * @param data_json JSON格式的数据
     * @return 0表示成功，-1表示失败
     */
    int (*send_data)(void* handle, const char* data_json);
    
    /**
     * @brief 初始化适配器
     * @param config 配置参数（JSON格式或配置文件路径）
     * @return 适配器句柄，失败返回NULL
     */
    void* (*init)(const char* config);
    
    /**
     * @brief 清理适配器
     * @param handle 适配器句柄
     */
    void (*cleanup)(void* handle);
} protocol_adapter_t;

/**
 * @brief 分发器配置
 */
typedef struct {
    uint32_t rule_count;               /* 规则数量 */
    route_rule_t* rules;               /* 规则数组 */
    uint32_t adapter_count;            /* 适配器数量 */
    protocol_adapter_t* adapters;      /* 适配器数组 */
} dispatcher_config_t;

/**
 * @brief 分发器句柄
 */
typedef void* dispatcher_handle_t;

/* ==================== 函数声明 ==================== */

/**
 * @brief 创建消息分发器
 * @param config 分发器配置
 * @return 分发器句柄，失败返回NULL
 */
dispatcher_handle_t dispatcher_create(const dispatcher_config_t* config);

/**
 * @brief 销毁消息分发器
 * @param handle 分发器句柄
 */
void dispatcher_destroy(dispatcher_handle_t handle);

/**
 * @brief 分发数据
 * @details 根据路由规则将数据分发到相应的协议
 * 
 * @param handle 分发器句柄
 * @param data_json JSON格式的IoT平台数据
 * @return 0表示成功，-1表示失败
 */
int dispatcher_dispatch(dispatcher_handle_t handle, const char* data_json);

/**
 * @brief 添加路由规则
 * @param handle 分发器句柄
 * @param rule 路由规则
 * @return 0表示成功，-1表示失败
 */
int dispatcher_add_rule(dispatcher_handle_t handle, const route_rule_t* rule);

/**
 * @brief 移除路由规则
 * @param handle 分发器句柄
 * @param rule_index 规则索引
 * @return 0表示成功，-1表示失败
 */
int dispatcher_remove_rule(dispatcher_handle_t handle, uint32_t rule_index);

/**
 * @brief 注册协议适配器
 * @param handle 分发器句柄
 * @param adapter 协议适配器
 * @return 0表示成功，-1表示失败
 */
int dispatcher_register_adapter(dispatcher_handle_t handle, const protocol_adapter_t* adapter);

#ifdef __cplusplus
}
#endif

#endif /* DATA_DISPATCHER_H */
